package com.vogue.supplymall.common.domain.tool;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.servlet.ServletInputStream;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Java Bean 一些操作的工具类
 * 1.验证Bean中的属性是否为空
 * 2.验证Bean中的数值型的小数位是否满足限制位数
 * @author 崔岳
 *
 */
public class BeanToolsUtils {

	public static final Logger LOGGER_BEANTOOLSUTILS = LoggerFactory.getLogger(BeanToolsUtils.class);

	/**
	 * 验证某个对象中的哪些属性字段为空
	 * 
	 * @param obj	检查的Bean对象
	 * @param fieldNames	指定检验哪些属性名称 null代表所有属性都检查
	 * @return	所有为空的属性字段名字的集合
	 * @throws IllegalAccessException
	 */
	public static List<String> checkObjFieldIsNull(Object obj,String[] fieldNames) throws IllegalAccessException{
		//查出来为空的字段的集合
		List<String> nullFieldList = new ArrayList<>();
		if(fieldNames == null) {
			for(Field f : obj.getClass().getDeclaredFields()){
		        f.setAccessible(true);
		        if(f.get(obj) == null){
		        	nullFieldList.add(f.getName());
		        }
		    }
		}else {
			//需要验证的属性名集合
			List<String> checkList = Arrays.asList(fieldNames);
			for(Field f : obj.getClass().getDeclaredFields()){
		        f.setAccessible(true);
		        if(checkList.contains(f.getName()) && (f.get(obj) == null||StringUtils.isBlank(f.get(obj).toString()))){
		        	nullFieldList.add(f.getName());
		        }
		    }
		}		
		return nullFieldList;
	}
	/**
	 * 验证某个对象中的哪些属性字段为空,并按照给定的提示语句返回提示信息
	 * @param obj	检查的Bean对象
	 * @param fieldNames	指定检验哪些属性名称 null代表所有属性都检查
	 * @param msg	提示的文字样本用于拼接提示语句
	 * @return	所有的关于字段说明的提示语句而不只是字段的名称
	 * @throws IllegalAccessException
	 */
	public static List<String> checkObjFieldIsNull(Object obj, String[] fieldNames, String msg) throws IllegalAccessException{
		//查出来为空的字段的集合
		List<String> nullFieldList = checkObjFieldIsNull(obj, fieldNames);
		List<String> msgList = new ArrayList<>();
		if(msg == null) {
			msg = "%s";
		}
		for(String field : nullFieldList) {
			msgList.add(String.format(msg, field));
		}
		return msgList;
	}
	
	/**
	 * 读取流信息，将流信息转化为字符串
	 */
	public static String streamToString(ServletInputStream sis) throws Exception{
		
		StringBuilder sbl=new StringBuilder();
		byte[] b=new byte[1024];
		int len=-1;
		while((len=sis.read(b))>0) {
			sbl.append(new String(b,0,len));
		}
		
		return sbl.toString();
	}
}
